/**
 * 递归调用
 * 1. 每次读取传入的第一个参数
 * 2. 返回一个新函数：新函数将旧函数读取的第一个参数与新函数的第一个参数相加，作为参数传入到旧函数中，并返回该旧函数；
 * 3. 递归调用旧函数
 * 缺点： 只能对每个括号里的第一个参数进行相加，多于一个的会被忽略。
 */
function sum(a){
  let temp = function (b){
    return sum(a + b);
  }
  temp.valueOf = function (){
    return a;
  }
  return temp;
}

/**
 * 函数柯里化
 */
let count = 0;
function add(...args){
  for (let i=0; i<args.length;i++){
    count += args[i];
  }
  return count
}
function currying(fn){
  let val = null;
  let temp = function (...newArgs){
    val = fn.apply(this, newArgs);
    return temp;
  }
  temp.valueOf = function (){
    count = 0;
    return val;
  }
  return temp;
}

console.log(sum(1)(2)(3).valueOf());

let addCurry = currying(add);
console.log(addCurry(1,2)(2,3)(3).valueOf());